package br.com.faculdade.application.controller;

import br.com.faculdade.domain.service.UsuarioService;
import br.com.faculdade.infrastructure.entity.Usuario;
import java.util.List;
import java.util.logging.Level;
import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.EncoderException;
import org.apache.commons.codec.net.BCodec;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.Create;
import org.jboss.seam.annotations.End;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.datamodel.DataModel;
import org.jboss.seam.annotations.datamodel.DataModelSelection;
import org.jboss.seam.log.Log;

/**
 *
 * @author Kirmaier Andrade
 */
@Scope(ScopeType.SESSION)
@Name("cadastroUsuarioAction")
public class CadastroUsuarioController extends BaseController {

    @Logger
    private Log log;
    //Injeção dos services
    @In
    private UsuarioService usuarioService;
    //Objetos
    private Usuario usuario;
    @DataModel("usuarios")
    private List<Usuario> usuariosDM;
    @DataModelSelection("usuarios")
    private Usuario usuarioSelecionado;
    private Operacao operacaoAtual;
    //Parametros de pesquisa
    private String paramNome;
    private String paramCPF;
    private static final String CADASTRO = "cadastro_usuario";
    private static final String USUARIO = "usuario";

    @Create
    public String setup() {
        usuariosDM = null;
        paramNome = null;
        paramCPF = null;

        usuario = null;

        return USUARIO;
    }

    private String criptografar(String senha) throws EncoderException {
        BCodec b = new BCodec();
        return b.encode(senha);
    }

    private String descriptografar(String senha) throws DecoderException {
        BCodec b = new BCodec();
        return b.decode(senha);
    }

    @Begin
    public String criarSetup() {
        operacaoAtual = Operacao.CRIACAO;

        usuario = usuarioService.criar();

        return CADASTRO;
    }

    @End
    public String criar() {
        try {
            usuario.setSenha(criptografar(usuario.getSenha()));
            try {
                usuarioService.salvar(usuario);

                adicionarMensagemInformacao("msgUsuarioCriarSucesso");

                pesquisar();

                return USUARIO;
            } catch (Exception e) {
                log.error(e);
                adicionarMensagemErro("msgUsuarioCriarError");
            }
            return USUARIO;

        } catch (EncoderException ex) {
            java.util.logging.Logger.getLogger(CadastroUsuarioController.class.getName()).log(Level.SEVERE, null, ex);
        }
        return USUARIO;
    }

    @Begin
    public String alterarSetup() {
        operacaoAtual = Operacao.ALTERACAO;
        try {
            usuario = usuarioService.obterPorId(usuarioSelecionado.getIdusuario());
        } catch (Exception e) {
            log.error(e);
        }
        return CADASTRO;
    }

    @End
    public String alterar() {
        try {
            usuario.setSenha(criptografar(usuario.getSenha()));

            usuarioService.alterar(usuario);

            adicionarMensagemInformacao("msgAlterarUsuarioSucesso");

            pesquisar();

            return USUARIO;
        } catch (Exception e) {
            log.error(e);

            adicionarMensagemErro("msgAlterarUsuarioError");
        }
        return USUARIO;
    }

    public String excluir() {
        usuario = usuarioService.obterPorId(usuarioSelecionado.getIdusuario());
        try {
            usuarioService.excluir(usuario);

            adicionarMensagemInformacao("msgExcluirUsuarioSucesso");

            pesquisar();
        } catch (Exception e) {
            log.error(e);

            adicionarMensagemErro("msgExcluirUsuarioError");
        }
        return null;
    }

    public void pesquisar() {
        usuariosDM = usuarioService.obterPorParametros(paramNome, paramCPF);
    }

    public void detalhar() {
        usuario = usuarioSelecionado;
    }

    @End
    public String cancelar() {

        usuarioService.cancelar();

        return USUARIO;
    }

    //<editor-fold defaultstate="collapsed" desc="GETters e SETters">
    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public String getParamCPF() {
        return paramCPF;
    }

    public void setParamCPF(String paramCPF) {
        this.paramCPF = paramCPF;
    }

    public String getParamNome() {
        return paramNome;
    }

    public void setParamNome(String paramNome) {
        this.paramNome = paramNome;
    }

    public Operacao getOperacaoAtual() {
        return operacaoAtual;
    }

    public void setOperacaoAtual(Operacao operacaoAtual) {
        this.operacaoAtual = operacaoAtual;
    }
    //</editor-fold>
}